// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com


#ifndef _FPDFORMFILL_H
#define _FPDFORMFILL_H
#include "fpdfview.h"

typedef void* FPDF_FORMHANDLE;

// Exported Functions
#ifdef __cplusplus
extern "C" {
#endif

typedef struct _IPDF_JsPlatform
{
/**
* Version number of the interface. Currently must be 1.
	**/
	int version;
	
	/** 
	* Method: app_alert
	*			pop up a dialog to show warning or hint.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	*			Msg			-	A string containing the message to be displayed.
	*			Title		-   The title of the dialog.
	*			Type		-	The stype of button group. 
	*							0-OK(default);
	*							1-OK,Cancel;
	*							2-Yes,NO; 
	*							3-Yes, NO, Cancel.
	*           nIcon		-   The Icon type. 
	*							0-Error(default);
	*							1-Warning;
	*							2-Question;
	*							3-Status.
	* Return Value:
	*			The return value could be the folowing type:
	*							1-OK;
	*							2-Cancel; 
	*							3-NO;
	*							4-Yes;
	*/
	int (*app_alert)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Msg, FPDF_WIDESTRING Title, int Type, int Icon);
	
	/** 
	* Method: app_beep
	*			Causes the system to play a sound. 
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	*			nType		-	The sound type.
	*							0 - Error
	*							1 - Warning
	*							2 - Question
	*							3 - Status
	*							4 - Default (default value)
	* Return Value:
	*			None
	*/
	void (*app_beep)(struct _IPDF_JsPlatform* pThis,  int nType);
	
	
	/** 
	* Method: app_response
	*			Displays a dialog box containing a question and an entry field for the user to reply to the question.  
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	*			Question	-	The question to be posed to the user.
	*			Title		-	The title of the dialog box.
	*			Default		-	A default value for the answer to the question. If not specified, no default value is presented.
	*			cLabel		-	A short string to appear in front of and on the same line as the edit text field. 
	*			bPassword	-	If true, indicates that the user's response should show as asterisks (*) or bullets (?) to mask the response, which might be sensitive information. The default is false.		
	*			response	-	A string buffer allocated by SDK, to receive the user's response. 
	*			length		-   The length of the buffer, number of bytes. Currently, It's always be 2048.
	* Return Value:
	*			Number of bytes the user input text consumes, not including trailing zeros. If the text exceed 2048 bytes,
	*			the exceeded part will be ignored.
	* Comments:
	*			No matter on what platform, the response should be always input in UTF-16LE encoding.
	*			The return value always indicated number of bytes required for the buffer, even when there is
	*			no buffer specified, or the buffer size is less then required. In this case, the buffer will not
	*			be modified.
	*/
	int (*app_response)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Question, FPDF_WIDESTRING Title, FPDF_WIDESTRING Default, FPDF_WIDESTRING cLabel, FPDF_BOOL bPassword, void* response, int length);
	
	
	
	/*
	* Method: Doc_getFilePath
	*			Get the file path of the current document. 
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	*			filePath	-	The string buffer to receive the file path. Can be NULL.
	*			length		-   The length of the buffer, number of bytes. Can be 0.
	* Return Value:
	*		Number of bytes the filePath consumes, including trailing zeros.
	* Comments:
	*		The filePath should be always input in local encoding.
	*
	*		The return value always indicated number of bytes required for the buffer, even when there is
	*		no buffer specified, or the buffer size is less then required. In this case, the buffer will not
	*		be modified.
	*/
	int (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis, void* filePath, int length);
	
	
	/*
	* Method: Doc_mail
	*			Mails the data buffer as an attachment to all recipients, with or without user interaction. 
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	*			mailData	-	Pointer to the data buffer to be sent.Can be NULL.
	*			length		-	The size,in bytes, of the buffer pointed by mailData parameter.Can be 0.
	*			bUI			-   If true, the rest of the parameters are used in a compose-new-message window that is displayed to the user. If false, the cTo parameter is required and all others are optional.
	*			To			-	A semicolon-delimited list of recipients for the message.
	*			Subject		-   The subject of the message. The length limit is 64 KB.
	*			CC			-	A semicolon-delimited list of CC recipients for the message. 
	*			BCC			-   A semicolon-delimited list of BCC recipients for the message. 
	*			Msg			-   The content of the message. The length limit is 64 KB.
	* Return Value:
	*			None.
	* Comments:
	*			If the parameter mailData is NULL or length is 0, the current document will be mailed as an attachment to all recipients.
	*/
	void (*Doc_mail)(struct _IPDF_JsPlatform* pThis,void* mailData, int length,FPDF_BOOL bUI, FPDF_WIDESTRING To, FPDF_WIDESTRING Subject, FPDF_WIDESTRING CC, FPDF_WIDESTRING BCC, FPDF_WIDESTRING Msg); 
	

	/*
	* Method: Doc_print
	*			Prints all or a specific number of pages of the document.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself.
	*			bUI			-	If true, will cause a UI to be presented to the user to obtain printing information and confirm the action.
	*			nStart		-	A 0-based index that defines the start of an inclusive range of pages.
	*			nEnd		-   A 0-based index that defines the end of an inclusive page range.
	*			bSilent		-   If true, suppresses the cancel dialog box while the document is printing. The default is false.
	*			bShrinkToFit	-	If true, the page is shrunk (if necessary) to fit within the imageable area of the printed page.
	*			bPrintAsImage	-	If true, print pages as an image.
	*			bReverse	-	If true, print from nEnd to nStart.
	*			bAnnotations	-	If true (the default), annotations are printed.
	*/
	void (*Doc_print)(struct _IPDF_JsPlatform* pThis, FPDF_BOOL bUI, int nStart, int nEnd, FPDF_BOOL bSilent ,FPDF_BOOL bShrinkToFit,FPDF_BOOL bPrintAsImage ,FPDF_BOOL bReverse ,FPDF_BOOL bAnnotations);

	/*
	* Method: Doc_submitForm
	*			Send the form data to a specified URL.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	*			formData	-	Pointer to the data buffer to be sent.
	*			length		-	The size,in bytes, of the buffer pointed by formData parameter.
	*			URL			-	The URL to send to.
	* Return Value:
	*			None.
	*
	*/
	void (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis,void* formData, int length, FPDF_WIDESTRING URL);
	
	/*
	* Method: Doc_gotoPage
	*			Jump to a specified page.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself
	*			nPageNum	-	The specified page number, zero for the first page.
	* Return Value:
	*			None.
	*
	*/
	void (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum);
	/*
	* Method: Field_browse
	*			Show a file selection dialog, and return the selected file path.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*			pThis		-	Pointer to the interface structure itself.
	*			filePath	-	Pointer to the data buffer to receive the file path.Can be NULL.
	*			length		-   The length of the buffer, number of bytes. Can be 0.
	* Return Value:
	*		Number of bytes the filePath consumes, including trailing zeros.
	* Comments:
	*		The filePath shoule be always input in local encoding.
	*/
	int  (*Field_browse)(struct _IPDF_JsPlatform* pThis,void* filePath, int length);

	/**
	*	pointer to FPDF_FORMFILLINFO interface.
	**/
	void*	m_pFormfillinfo;
} IPDF_JSPLATFORM;

// Flags for Cursor type
#define FXCT_ARROW	0
#define FXCT_NESW	1		
#define FXCT_NWSE	2		
#define FXCT_VBEAM	3		
#define FXCT_HBEAM	4	
#define FXCT_HAND	5

/**
 * Declares of a pointer type to the callback function for the FFI_SetTimer method.
 * Parameters:
 *			idEvent		-	Identifier of the timer. 
 * Return value:
 *			None. 
 **/	
typedef void	(*TimerCallback)(int idEvent);

/**
 * Declares of a struct type to the local system time.
**/
typedef struct _FPDF_SYSTEMTIME 
{
    unsigned short wYear;			/* years since 1900 */
    unsigned short wMonth;			/* months since January - [0,11] */
    unsigned short wDayOfWeek;		/* days since Sunday - [0,6] */
    unsigned short wDay;			/* day of the month - [1,31] */
    unsigned short wHour;			/* hours since midnight - [0,23] */
    unsigned short wMinute;			/* minutes after the hour - [0,59] */
    unsigned short wSecond;			/* seconds after the minute - [0,59] */
    unsigned short wMilliseconds;	/* milliseconds after the second - [0,999] */
}FPDF_SYSTEMTIME;


typedef struct  _FPDF_FORMFILLINFO
{
	/**
	 * Version number of the interface. Currently must be 1.
	 **/
	int	version;

		/** 
	 * Method: Release
	 *			Give implementation a chance to release any data after the interface is no longer used
	 * Interface Version:
	 *			1
	 * Implementation Required:
	 *			No
	 * Comments:
	 *			Called by Foxit SDK during the final cleanup process.
	 * Parameters:
	 *			pThis		-	Pointer to the interface structure itself
	 * Return Value:
	 *			None
	 */

	void (*Release)(struct _FPDF_FORMFILLINFO* pThis);

	/** 
	 * Method: FFI_Invalidate
	 *			Invalidate the client area within the specified rectangle.
	 * Interface Version:
	 *			1
	 * Implementation Required:
		*			yes
	 * Parameters:
	 *			pThis		-	Pointer to the interface structure itself.
	 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
	 *			left		-	Left position of the client area in PDF page coordinate.
	 *			top			-	Top  position of the client area in PDF page coordinate.
	 *			right		-	Right position of the client area in PDF page  coordinate.
	 *			bottom		-	Bottom position of the client area in PDF page coordinate.
	 * Return Value:
	 *			None.
	 *
	 *comments:
	 *			All positions are measured in PDF "user space".
	 *			Implementation should call FPDF_RenderPageBitmap() function for repainting a specified page area.
	*/
	void (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);
	
	/** 
	 * Method: FFI_OutputSelectedRect
	 *			When user is taking the mouse to select texts on a form field, this callback function will keep 
	 *			returning the selected areas to the implementation.
	 *
	 * Interface Version:
	 *			1
	 * Implementation Required:
	 *			No
	 * Parameters:
	 *			pThis		-	Pointer to the interface structure itself.
	 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
	 *			left		-	Left position of the client area in PDF page coordinate.
	 *			top			-	Top  position of the client area in PDF page coordinate.
	 *			right		-	Right position of the client area in PDF page  coordinate.
	 *			bottom		-	Bottom position of the client area in PDF page coordinate.
	 * Return Value:
	 *			None.
	 *
	 * comments:
	 *			This CALLBACK function is useful for implementing special text selection effect. Implementation should
	 *			first records the returned rectangles, then draw them one by one at the painting period, last,remove all 
	 *			the recorded rectangles when finish painting.
	*/
	void (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);

	/** 
	* Method: FFI_SetCursor
	*			Set the Cursor shape.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	* 		nCursorType	-	Cursor type. see Flags for Cursor type for the details.
	* 	Return value:
	* 		None.
	* */
	void (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType);

	/** 
	* Method: FFI_SetTimer
	*			This method installs a system timer. A time-out value is specified, 
	*			and every time a time-out occurs, the system passes a message to
	*			the TimerProc callback function. 
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	* 		uElapse		-	Specifies the time-out value, in milliseconds.
	* 		lpTimerFunc	-	A pointer to the callback function-TimerCallback.
	* 	Return value:
	* 		The timer identifier of the new timer if the function is successful.
	*		An application passes this value to the FFI_KillTimer method to kill 
	*		the timer. Nonzero if it is successful; otherwise, it is zero.
	* */
	int  (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis, int uElapse, TimerCallback lpTimerFunc);

	/** 
	* Method: FFI_KillTimer
	*			This method kills the timer event identified by nIDEvent, set by an earlier call to FFI_SetTimer. 
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	* 		nTimerID	-	The timer ID return by FFI_SetTimer function.
	* 	Return value:
	* 		None.
	* */
	void (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID);


	/** 
	* Method: FFI_GetLocalTime
	*			This method receives the current local time on the system. 
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	* 	Return value:
	* 		None.
	* */
	FPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis);

	/** 
	* Method: FFI_OnChange
	*			This method will be invoked to notify implementation when the value of any FormField on the document had been changed.
	* Interface Version:
	*			1
	* Implementation Required:
	*			no
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	* 	Return value:
	* 		None.
	* */
	void (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis);

	/** 
	* Method: FFI_GetPage
	*			This method receives the page pointer associated with a specified page index.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	*		document	-	Handle to document. Returned by FPDF_LoadDocument function.
	*		nPageIndex  -	Index number of the page. 0 for the first page.
	* Return value:
	* 		Handle to the page. Returned by FPDF_LoadPage function.
	* Comments:
	*		In some cases, the document-level JavaScript action may refer to a page which hadn't been loaded yet.
	*		To successfully run the javascript action, implementation need to load the page for SDK.
	* */
	FPDF_PAGE	(*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, int nPageIndex);

	/** 
	* Method: FFI_GetCurrentPage
	*		This method receives the current page pointer.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	*		document	-	Handle to document. Returned by FPDF_LoadDocument function.
	* Return value:
	* 		Handle to the page. Returned by FPDF_LoadPage function.
	* */
	FPDF_PAGE	(*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document);

	/** 
	* Method: FFI_GetRotation
	*			This method receives currently rotation of the page view.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis		-	Pointer to the interface structure itself.
	*		page		-	Handle to page. Returned by FPDF_LoadPage function.
	* Return value:
	* 		The page rotation. Should be 0(0 degree),1(90 degree),2(180 degree),3(270 degree), in a clockwise direction.
	* */
	int 	(*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page);

	/** 
	* Method: FFI_ExecuteNamedAction
	*			This method will execute an named action.
	* Interface Version:
	*			1
	* Implementation Required:
	*			yes
	* Parameters:
	*		pThis			-	Pointer to the interface structure itself.
	*		namedAction		-	A byte string which indicates the named action, terminated by 0.
	* Return value:
	* 		None.
	* Comments:
	*		See the named actions description of <<PDF Reference, version 1.7>> for more details.  
	* */
	void 	(*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING namedAction);
	/** 
	* @brief This method will be called when a text field is getting or losing a focus.
	*
	* @param[in] pThis		Pointer to the interface structure itself.
	* @param[in] value		The string value of the form field, in UTF-16LE format.
	* @param[in] valueLen	The length of the string value, number of characters (not bytes).
	* @param[in] is_focus	True if the form field is getting a focus, False for losing a focus.
	*
	* @return None.
	*
	* @note Currently,only support text field and combobox field.
	* */
	void	(*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING value, FPDF_DWORD valueLen, FPDF_BOOL is_focus);

	
	/** 
	* Method: FFI_DoURIAction
	*			This action resolves to a uniform resource identifier. 
	* Interface Version:
	*			1
	* Implementation Required:
	*			No
	* Parameters:
	*		pThis			-	Pointer to the interface structure itself.
	*		bsURI			-	A byte string which indicates the uniform resource identifier, terminated by 0.
	* Return value:
	* 		None.
	* Comments:
	*		See the URI actions description of <<PDF Reference, version 1.7>> for more details.  
	* */
	void	(*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING bsURI);
	
	/** 
	* Method: FFI_DoGoToAction
	*			This action changes the view to a specified destination.
	* Interface Version:
	*			1
	* Implementation Required:
	*			No
	* Parameters:
	*		pThis			-	Pointer to the interface structure itself.
	*		nPageIndex		-	The index of the PDF page.
	*		zoomMode		-	The zoom mode for viewing page.See Macros "PDFZOOM_XXX" defined in "fpdfdoc.h". 
	*		fPosArray		-	The float array which carries the position info.
	*		sizeofArray		-	The size of float array.
	* Return value:
	* 		None.
	* Comments:
	*		See the Destinations description of <<PDF Reference, version 1.7>> in 8.2.1 for more details.  
	**/
	void	(*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis, int nPageIndex, int zoomMode, float* fPosArray, int sizeofArray);
	/**
	*	pointer to IPDF_JSPLATFORM interface
	**/
	IPDF_JSPLATFORM*	m_pJsPlatform;

} FPDF_FORMFILLINFO;



/**
 * Function: FPDFDOC_InitFormFillEnviroument
 *			Init form fill environment. 
 * Comments:
 *			This function should be called before any form fill operation.
 * Parameters:
 *			document		-	Handle to document. Returned by FPDF_LoadDocument function.
 *			pFormFillInfo	-	Pointer to a FPDF_FORMFILLINFO structure.
 * Return Value:
 *			Return handler to the form fill module. NULL means fails. 
 **/
DLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnviroument(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo);

/**
 * Function: FPDFDOC_ExitFormFillEnviroument
 *			Exit form fill environment. 
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 * Return Value:
 *			NULL.
 **/
DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnviroument(FPDF_FORMHANDLE hHandle);

/**
 * Function: FORM_OnAfterLoadPage
 *			This method is required for implementing all the form related functions. Should be invoked after user 
 *			successfully loaded a PDF page, and method FPDFDOC_InitFormFillEnviroument had been invoked.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 * Return Value:
 *			NONE.
 **/
DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);

/**
 * Function: FORM_OnBeforeClosePage
 *			This method is required for implementing all the form related functions. Should be invoked before user 
 *			close the PDF page.
 * Parameters:
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 * Return Value:
 *			NONE.
 **/
DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);

/**
* Function: FORM_DoDocumentJSAction
*			This method is required for performing Document-level JavaScript action. It should be invoked after the PDF document
*			had been loaded.
* Parameters:
*			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
* Return Value:
*			NONE
* Comments:
*			If there is Document-level JavaScript action embedded in the document, this method will execute the javascript action;
*			otherwise, the method will do nothing.
**/
DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle);


/**
* Function: FORM_DoDocumentOpenAction
*			This method is required for performing open-action when the document is opened.
* Parameters:
*			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
* Return Value:
*			NONE
* Comments:
*			This method will do nothing if there is no open-actions embedded in the document. 
**/
DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle);


// additional actions type of document.
#define FPDFDOC_AACTION_WC		0x10		//WC, before closing document, JavaScript action.
#define FPDFDOC_AACTION_WS		0x11		//WS, before saving document, JavaScript action.
#define FPDFDOC_AACTION_DS		0x12		//DS, after saving document, JavaScript action.
#define FPDFDOC_AACTION_WP		0x13		//WP, before printing document, JavaScript action.
#define FPDFDOC_AACTION_DP		0x14		//DP, after printing document, JavaScript action. 
/**
* Function: FORM_DoDocumentAAction
*			This method is required for performing the document's additional-action.
* Parameters:
*			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
*			aaType	    -   The type of the additional-actions which defined above.
* Return Value:
*			NONE
* Comments:
*			This method will do nothing if there is no document additional-action corresponding to the specified aaType.
**/

DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaType);

// Additional-action types of page object
#define FPDFPAGE_AACTION_OPEN		0		// /O -- An action to be performed when the page is opened
#define FPDFPAGE_AACTION_CLOSE		1		// /C -- An action to be performed when the page is closed

/**
* Function: FORM_DoPageAAction
*			This method is required for performing the page object's additional-action when opened or closed.
* Parameters:
*			page		-	Handle to the page. Returned by FPDF_LoadPage function.
*			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
*			aaType	    -   The type of the page object's additional-actions which defined above.
* Return Value:
*			NONE
* Comments:
*			This method will do nothing if no additional-action corresponding to the specified aaType exists.
**/
DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandle, int aaType);

/**
 * Function: FORM_OnMouseMove
 *			You can call this member function when the mouse cursor moves. 
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			modifier		-	Indicates whether various virtual keys are down. 
 *			page_x		-	Specifies the x-coordinate of the cursor in PDF user space. 
 *			page_y		-	Specifies the y-coordinate of the cursor in PDF user space.
 * Return Value:
 *			TRUE indicates success; otherwise false.
 **/
DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);

/**
 * Function: FORM_OnLButtonDown
 *			You can call this member function when the user presses the left mouse button.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			modifier		-	Indicates whether various virtual keys are down. 
 *			page_x		-	Specifies the x-coordinate of the cursor in PDF user space. 
 *			page_y		-	Specifies the y-coordinate of the cursor in PDF user space.
 * Return Value:
 *			TRUE indicates success; otherwise false.
 **/
DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);

/**
 * Function: FORM_OnLButtonUp
 *			You can call this member function when the user releases the left mouse button.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			modifier	-	Indicates whether various virtual keys are down. 
 *			page_x		-	Specifies the x-coordinate of the cursor in device. 
 *			page_y		-	Specifies the y-coordinate of the cursor in device.
 * Return Value:
 *			TRUE indicates success; otherwise false.
 **/
DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);

/**
 * Function: FORM_OnKeyDown
 *			You can call this member function when a nonsystem key is pressed. 
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			nKeyCode	-	Indicates whether various virtual keys are down. 
 *			modifier	-	Contains the scan code, key-transition code, previous key state, and context code.
 * Return Value:
 *			TRUE indicates success; otherwise false.
 **/
DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);

/**
 * Function: FORM_OnKeyUp
 *			You can call this member function when a nonsystem key is released. 
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			nKeyCode	-	The virtual-key code of the given key.
 *			modifier	-	Contains the scan code, key-transition code, previous key state, and context code.
 * Return Value:
 *			TRUE indicates success; otherwise false.
 **/
DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);

/**
 * Function: FORM_OnChar
 *			You can call this member function when a keystroke translates to a nonsystem character.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			nChar		-	The character code value of the key.  
 *			modifier	-	Contains the scan code, key-transition code, previous key state, and context code.
 * Return Value:
 *			TRUE indicates success; otherwise false.
 **/
DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nChar, int modifier);

/**
 * Function: FORM_ForceToKillFocus.
 *			You can call this member function to force to kill the focus of the form field which got focus.
 *			It would kill the focus on the form field, save the value of form field if it's changed by user.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 * Return Value:
 *			TRUE indicates success; otherwise false.
 **/
DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle);

// Field Types
#define FPDF_FORMFIELD_UNKNOWN		0		// Unknown.
#define FPDF_FORMFIELD_PUSHBUTTON	1		// push button type.
#define FPDF_FORMFIELD_CHECKBOX		2		// check box type.
#define FPDF_FORMFIELD_RADIOBUTTON	3		// radio button type.
#define FPDF_FORMFIELD_COMBOBOX		4		// combo box type.
#define FPDF_FORMFIELD_LISTBOX		5		// list box type.
#define FPDF_FORMFIELD_TEXTFIELD	6		// text field type.

/**
 * Function: FPDPage_HasFormFieldAtPoint
 *			Check the form filed position by point.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			page		-	Handle to the page. Returned by FPDF_LoadPage function.
 *			page_x		-	X position in PDF "user space".
 *			page_y		-	Y position in PDF "user space".
 * Return Value:
 *			Return the type of the formfiled; -1 indicates no fields.
 **/
DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,double page_x, double page_y);

/**
 * Function: FPDF_SetFormFieldHighlightColor
 *			Set the highlight color of specified or all the form fields in the document.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			doc			-	Handle to the document. Returned by FPDF_LoadDocument function.
 *			fieldType	-	A 32-bit integer indicating the type of a form field(defined above).
 *			color		-	The highlight color of the form field.Constructed by 0xxxrrggbb.
 * Return Value:
 *			NONE.
 * Comments:
 *			When the parameter fieldType is set to zero, the highlight color will be applied to all the form fields in the 
 *			document.
 *			Please refresh the client window to show the highlight immediately if necessary.
 **/
DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, int fieldType, unsigned long color);

/**
 * Function: FPDF_SetFormFieldHighlightAlpha
 *			Set the transparency of the form field highlight color in the document.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 *			doc			-	Handle to the document. Returned by FPDF_LoadDocument function.
 *			alpha		-	The transparency of the form field highlight color. between 0-255.
 * Return Value:
 *			NONE.
 **/
DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha);


/**
 * Function: FPDF_RemoveFormFieldHighlight
 *			Remove the form field highlight color in the document.
 * Parameters:
 *			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
 * Return Value:
 *			NONE.
 * Comments:
 *			Please refresh the client window to remove the highlight immediately if necessary.
 **/
DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle);

/**
* Function: FPDF_FFLDraw
*			Render FormFeilds on a page to a device independent bitmap. 			
* Parameters:
*			hHandle		-	Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
*			bitmap		-	Handle to the device independent bitmap (as the output buffer).
*							Bitmap handle can be created by FPDFBitmap_Create function.
*			page		-	Handle to the page. Returned by FPDF_LoadPage function.
*			start_x		-	Left pixel position of the display area in the device coordinate.
*			start_y		-	Top pixel position of the display area in the device coordinate.
*			size_x		-	Horizontal size (in pixels) for displaying the page.
*			size_y		-	Vertical size (in pixels) for displaying the page.
*			rotate		-	Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
*								2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
*			flags		-	0 for normal display, or combination of flags defined above. 
* Return Value:
*			None.
* Comments: 
*			This method is designed to only render annotations and FormFields on the page. 
*			Without FPDF_ANNOT specified for flags, Rendering functions such as FPDF_RenderPageBitmap or FPDF_RenderPageBitmap_Start will only render page contents(without annotations) to a bitmap.
*			In order to implement the FormFill functions,Implementation should call this method after rendering functions finish rendering the page contents.
**/
DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, 
						int size_x, int size_y, int rotate, int flags);



#ifdef __cplusplus
};
#endif

#endif //_FPDFORMFILL_H

